package com.hm.pan.util;

import java.io.File;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import com.alibaba.fastjson.JSON;
import com.hm.pan.model.UserFile;
import com.hm.pan.util.DownloadUtil.ZipFileEntry;

public class UserFileUtil {

	static int xx = 0;

	/**
	 * 把查询结果转换为树型结构
	 * 
	 * @param list
	 * @param userfileId
	 * @return
	 */
	public static UserFile mergeUserFiles(List<UserFile> list, long userfileId) {
		Map<Long, UserFile> map = new HashMap<>();
		/**
		 * 一次查询把所有的文件装入map中，key为文件的id，方便子文件找到自己的父亲
		 */
		for (UserFile userFile : list) {
			map.put(userFile.getUserfileId(), userFile);
		}
		/**
		 * 迭代map中的文件
		 */
		Iterator<Entry<Long, UserFile>> iterator = map.entrySet().iterator();
		while (iterator.hasNext()) {
			Entry<Long, UserFile> next = iterator.next();
			UserFile child = next.getValue(); // 子文件找父亲的主角
			Long fatherId = child.getFatherId(); // 获取父亲的id
			UserFile parent = map.get(fatherId); // 根据父亲的ID在map中找到父亲
			if (parent != null) // 父亲有可能不存在
				parent.getChildren().add(child); // 在父亲的众多儿子中加入子文件本身
		}

		return map.get(userfileId); // 返回没有父亲的那个祖宗就可以了
	}

	/**
	 * 转换查询结果为ZipFileEntry，为压缩做准备
	 * 
	 * @param list
	 * @param userfileId
	 * @return
	 */
	public static List<ZipFileEntry> prepareZip(List<UserFile> list, long userfileId) {
		// 将list转换为map（因为userfileId不会重复，所以可以转换）
		Map<Long, UserFile> map = new HashMap<>();
		for (UserFile userFile : list) {
			map.put(userFile.getUserfileId(), userFile);
		}

		System.err.println("==================转换的Map==================");
		System.err.println(JSON.toJSONString(map));

		// 用map模拟文件树
		Iterator<Entry<Long, UserFile>> iterator = map.entrySet().iterator();
		// 要删除的子元素
		ArrayList<Long> toDelete = new ArrayList<Long>();

		// 生成文件树
		while (iterator.hasNext()) {
			Entry<Long, UserFile> next = iterator.next();
			UserFile child = next.getValue(); // 从map中拿出一个用户文件
			Long fatherId = child.getFatherId(); // 找父文件夹id
			UserFile parent = map.get(fatherId); // 根据id拿到父文件夹
			if (parent != null) {
				parent.getChildren().add(child);
//				map.remove(child.getUserfileId());
				// 把要删除的元素丢进list
				toDelete.add(child.getUserfileId());
			}
		}

		// ========去重========
		for (Long long1 : toDelete) {
			map.remove(long1);
		}

		System.out.println("===================去重后=======================");
		System.out.println(JSON.toJSONString(map));

		List<ZipFileEntry> arrayList = new ArrayList<ZipFileEntry>();

		for (Long key : map.keySet()) {
			prepare0(arrayList, map.get(key), null);
		}

		System.err.println("=========================== prepareZip ==============================");
		System.err.println(JSON.toJSONString(arrayList));

		return arrayList.size() == 0 ? null : arrayList;
	}

	private static void prepare0(List<ZipFileEntry> list, UserFile userFile, String baseName) {
		if (list == null || userFile == null) {
			return;
		}

		String name;

		if (StringUtil.isEmpty(baseName)) {
			name = userFile.getFileName();
		} else {
			name = baseName + "/" + userFile.getFileName();
		}

		if (userFile.getFileType()) { // 普通文件，直接放入List
			list.add(new ZipFileEntry(new File(userFile.getFileInfo().getFilePath()), name));
			return;
		}

		list.add(new ZipFileEntry(null, name + "/"));

		for (UserFile child : userFile.getChildren()) { // 文件夹，迭代子文件，递归放入
			prepare0(list, child, name);
		}
	}

	/**
	 * 创建临时目录
	 */
	public static boolean createTmpDir(String tempDir) {
		File file = new File(tempDir);

		if (!file.exists()) {
			return file.mkdir();
		}

		return true;
	}
}
